package utils

import (
	"crypto/rand"
	"math"
	"math/big"
)

type Addable interface {
	int | int8 | int16 | int32 | int64 |
		uint | uint8 | uint16 | uint32 | uint64 |
		string | float32 | float64 | uintptr
}

// 加减乘除运算
func Add[T Addable](a, b T) T { return a + b }

// 最大的数
func MyMax[T Addable](args []T) T {
	m := args[0]
	for _, v := range args {
		if m < v {
			m = v
		}
	}
	return m
}

// 最小的数
func MyMin[T Addable](args []T) T {
	m := args[0]
	for _, v := range args {
		if m > v {
			m = v
		}
	}
	return m
}

/*
查找某个值是否存在,return key
FindWithArr([]int{1,2,3,5},5)
*/
func FindWithArr[T comparable](args []T, val T) int {
	for k, v := range args {
		if val == v {
			return k
		}
	}
	return -1
}

/*
对slice中每个值单独处理
vi:=[]int{1,2,3}

	vs := MapSliceFunc(vi, func(v int) string{
		return fmt.Sprint(v*v)
	})
*/
func MapSliceFunc[T any, M any](args []T, f func(T) M) []M {
	n := make([]M, len(args), cap(args))
	for k, v := range args {
		n[k] = f(v)
	}
	return n
}

/*
参数1:四舍五入
参数2:保留多少位小数点
*/
func MathRound(val float64, precision int) float64 {
	p := math.Pow10(precision)
	return math.Floor(val*p+0.5) / p
}

// 取两个数字之间的随机数
func RandInt64(min, max int64) int64 {
	maxBigInt := big.NewInt(max)

	i, _ := rand.Int(rand.Reader, maxBigInt)

	if i.Int64() < min {
		RandInt64(min, max)
	}
	return i.Int64()
}
